﻿using log4net;
using per.esmool.utils;
using System;

namespace FlowSimulate {

    public class Program {

        private static readonly ILog LOG = LogManager.GetLogger(typeof(Program));

        static void Main(string[] _) {
            var workDateKit = new WorkDateKit("configs/exceptionalCalendar.yml") {
                SaturdayIsWorkDate  = true,
                SundayIsWorkDate    = false,
                StartTimeOfDay      =  8 * 60, // 早上上班时刻, 08:00, 取值为从 0 点开始的分钟数, 下同
                EndTimeOfDay        = 18 * 60, // 晚上下班时刻, 18:00
                BreakStartTimeOfDay = 12 * 60, // 午休开始时刻, 12:00
                BreakEndTimeOfDay   = 14 * 60, // 午休截止时刻, 14:00
            };

            // 项目开始日期
            var startDate = DateTime.Parse("2023-06-04");

            // 设定任务内容、工作流过程结构和预设的人力消耗, 其中:
            //   flow.yml 里面定义了工序制程以及之间的相对顺序关系
            //   modules.yml 里面定义了各个任务模块
            //   costs.dat 里面定义了各个任务模块、各个工序的人工数消耗量(单位为人天)
            var suit = new Suit("configs/flow.yml", "configs/modules.yml", "configs/costs.dat");

            // 内容资源调度器
            var resourceDispatcher = new ResourceDispatcher("configs/resources.yml");

            // 任务细项生成器, 根据 suit 的设定, 随机产生一批任务, 完成上述工作内容、满足上述工作次序并形成上述的指定工作量消耗
            var creator = new TaskMaker() {
                Suit = suit,
                MinTaskCost = 0.5f,
                MaxTaskCost = 2.0f,
            };

            // 任务编排器, 将前述创建的任务按照指定的工作日历, 分配给指定的人力资源集合, 其中:
            //   assets 里面放到是各个岗位的员工名单
            var director = new Director("configs/assets.yml") {
                WorkDateKit = workDateKit,
            };

            // AIClientID 和 AIClientSecret 获取方法参见 https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Ilkkrb0i5#header%E5%8F%82%E6%95%B0
            AIRequester requester = new() {
                AIClientID = "TODO",
                AIClientSecret = "TODO",
            };

            // AI 呼叫器, 随机的根据 prompt.yml 设定的提示词发送 AI 询问
            var aiInvoker = new AIInvoker("configs/prompts.yml") {
                AIRequester = requester,
                MinAskTimes = 3,
                MaxAskTimes = 7,
            };

            // 修辞器, 负责将编排好的任务, 借助 AI 进行修辞美化, 实现拟人效果
            // descriptions.yml 中定义各种任务 Title, Description, Comment 的初始写法, 之后将调用 AIInvoker 进行修辞
            var rhetorician = new Rhetorician("configs/descriptions.yml") {
                ResourceDispatcher = resourceDispatcher,
                AIInvoker = aiInvoker,
            };

            // 输出器, 面向禅道输出修辞完成的内容
            using var outputer = new Outputer(
                connectionString: "Server=localhost;Port=3306;Database=zentao;Uid=root;Pwd=123456",
                fileStore: "../../Workspace/zentaopms/www/data/upload"
            );
            
            LOG.Info("Starting simulate work flow");
            var tasks = creator.CreateTasks();
            var arrangedTasks = director.Arrange(tasks, startDate);
            var personatedTasks = rhetorician.Personate(arrangedTasks);
            outputer.Output(personatedTasks, director);
            LOG.Info("Workflow simulate completed");
        }
    }
}
